home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyInternetConfig.p < prev    next >
Encoding:
Text File  |  1997-02-26  |  12.8 KB  |  474 lines  |  [TEXT/CWIE]

  1. unit MyInternetConfig;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types,
  7.         ICTypes, ICKeys;
  8.  
  9.     var
  10.         has_IC: boolean;
  11.         internet_config_instance: ICInstance;
  12.  
  13.     procedure StartupInternetConfig;
  14.     procedure ConfigureInternetConfig(creator: OSType; required: Boolean);
  15.     function GetFilenameInfo (name: Str255; var entry: ICMapEntry; istext: boolean): boolean;
  16. { NOTE: entry will always be valid as a "best guess"}
  17.     function GetCreatorTypeInfo (fcreator, ftype: OSType; name: Str255; var entry: ICMapEntry): boolean;
  18. { NOTE: entry will always be valid as a "best guess"}
  19.     function GetTextCreator: OSType; { DONT USE FOR EDITOR HELPER! }
  20.     procedure GetBinaryCreator;
  21.     function GetTextHelper: OSType;
  22.     function GetHelper (name: Str255; var app: ICAppSpec): OSErr;
  23.     function GetICString (const key: Str255; var data: Str255): OSErr;
  24.     function GetICStr (const key: Str255): Str255;
  25.     function SetICString (const key: Str255; data: Str255): OSErr;
  26.     function GetICBoolean( const key: Str255; var result: Boolean ): OSErr;
  27.     function GetICBool( const key: Str255 ): Boolean;
  28.     function SetICBoolean( const key: Str255; result: Boolean ): OSErr;
  29.     function MyICBegin (perm: ICPerm): OSErr;
  30.     function MyICEnd: OSErr;
  31.     function LaunchInternetConfig:OSErr;
  32.     function CheckICUsageVersion(component_version:longint): OSErr;
  33.     function MyLaunchURL(hint,url:Str255): OSErr;
  34.     function SafeICGetPrefHandle (inst: ICInstance; const key: Str255; var attr: ICAttr; var prefh: Handle): ICError;
  35.     procedure GetFontSize (key1,key2:Str255; deffont,defsize:integer; var font, size: integer);
  36.     procedure GetScreenFontSize (var font, size: integer);
  37.     procedure GetListFontSize (var font, size: integer);
  38.  
  39. implementation
  40.  
  41.     uses
  42.         TextUtils, Errors, Components, Fonts, Memory, Events, 
  43.         MyMemory, MySystemGlobals, MyUtils, ICAPI, MyStrings, MyProcesses, MyStartup;
  44.  
  45.     const
  46.         IC_first_entry_pos = 0;
  47.         
  48. {$ifc do_debug}
  49.     var
  50.         startup_check: integer;
  51. {$endc}
  52.  
  53.     var
  54.         map_handle: Handle;
  55.         ic_seed: longint;
  56.         text_creator: OSType;
  57.         binary_creator: OSType;
  58.         binary_type: OSType;
  59.         binary_creator_app_name:Str63;
  60.         last_checked:longint;
  61.         g_creator: OSType;
  62.         g_required: Boolean;
  63.         
  64.     function SafeICGetPrefHandle (inst: ICInstance; const key: Str255; var attr: ICAttr; var prefh: Handle): ICError;
  65.         var
  66.             err, junk:ICError;
  67.             size: longint;
  68.             did_begin: boolean;
  69.     begin
  70.         prefh := nil;
  71.         err := ICFindPrefHandle(inst, key, attr, prefh);
  72.         if err <> noErr then begin
  73.             did_begin := ICBegin(inst, icReadOnlyPerm) = noErr;
  74.             err := ICGetPref(inst, key, attr, nil, size);
  75.             if err = noErr then begin
  76.                 err := MNewHandle( prefh, size );
  77.                 if err = noErr then begin
  78.                     HLock(prefh);
  79.                     err := ICGetPref(inst, key, attr, prefh^, size);
  80.                     HUnlock(prefh);
  81.                 end;
  82.             end;
  83.             if did_begin then begin
  84.                 junk := ICEnd(inst);
  85.             end;
  86.         end;
  87.         if err <> noErr then begin
  88.             MDisposeHandle( prefh );
  89.             prefh := nil;
  90.         end;
  91.         SafeICGetPrefHandle := err;
  92.     end;
  93.     
  94.     function ICMapErr (icerr: ICError): OSErr;
  95.     begin
  96.         AssertDidStartup( startup_check );
  97.         if (icerr < -32768) or (icerr > 32767) then begin
  98.             icerr := icInternalErr;
  99.         end; (* if *)
  100.         ICMapErr := icerr;
  101.     end; (* ICMapErr *)
  102.  
  103.     function MyLaunchURL(hint,url:Str255): OSErr;
  104.         var
  105.             start,fin:longint;
  106.     begin
  107.         AssertDidStartup( startup_check );
  108.         MyLaunchURL := -1;
  109.         if has_IC then begin
  110.             start := 0;
  111.             fin := length(url);
  112.             MyLaunchURL := ICMapErr(ICLaunchURL (internet_config_instance,hint, @url[1],length(url), start,fin));
  113.         end;
  114.     end;
  115.     
  116.     function CheckICUsageVersion(component_version:longint): OSErr;
  117.         var
  118.             err: OSErr;
  119.             component_instance: ComponentInstance;
  120.     begin
  121.         err := ICMapErr(ICGetComponentInstance(internet_config_instance, component_instance));
  122.         if err = noErr then begin
  123.             if BAND(GetComponentVersion(component_instance), $FFFF0000) < BAND(component_version, $FFFF0000) then begin
  124.                 err := unimpErr;
  125.             end;
  126.         end else begin
  127.             err := noErr; { we work fine without a component, we just can't deal with an old component }
  128.         end;
  129.         CheckICUsageVersion := err;
  130.     end;
  131.  
  132.     function LaunchInternetConfig:OSErr;
  133.     begin
  134.         LaunchInternetConfig:= ICMapErr(ICEditPreferences (internet_config_instance,''));
  135.     end;
  136.     
  137.     function MyGetMapHandle (var hhhh: Handle): boolean;
  138.         var
  139.             seed: longint;
  140.             junk: ICError;
  141.             junk_attr: longint;
  142.     begin
  143.         AssertDidStartup( startup_check );
  144.         if (map_handle <> nil) then begin
  145.             if last_checked<TickCount-120 then begin
  146.                 if (ICGetSeed(internet_config_instance, seed) <> noErr) | (seed <> ic_seed) then begin
  147.                     MDisposeHandle(map_handle);
  148.                 end else begin
  149.                     last_checked:=TickCount;
  150.                 end;
  151.             end;
  152.         end;
  153.  
  154.         if (map_handle = nil) then begin
  155.             junk := SafeICGetPrefHandle( internet_config_instance, kICMapping, junk_attr, map_handle);
  156.             if (map_handle <> nil) & (ICGetSeed(internet_config_instance, seed) = noErr) then begin
  157.                 text_creator := OSType(0);
  158.                 binary_creator := OSType(0);
  159.                 ic_seed := seed;
  160.             end;
  161.         end;
  162.         hhhh := map_handle;
  163.         MyGetMapHandle := hhhh <> nil;
  164.     end;
  165.  
  166.     function GetHelper (name: Str255; var app: ICAppSpec): OSErr;
  167.         var
  168.             err: OSErr;
  169.             attr: ICAttr;
  170.             prefsize: longint;
  171.     begin
  172.         if has_IC then begin
  173.             prefsize := SizeOf(ICAppSpec);
  174.             err := ICMapErr(ICGetPref(internet_config_instance, concat(kICHelper, name), attr, @app, prefsize));
  175.             if (err = noErr) & ((prefsize < 5) | (prefsize < 5 + length(app.name))) then begin
  176.                 err := badExtResource;
  177.             end;
  178.         end else begin
  179.             err := -1;
  180.         end;
  181.         GetHelper := err;
  182.     end;
  183.  
  184.     function GetTextHelper: OSType;
  185.         var
  186.             app:ICAppSpec;
  187.     begin
  188.         if GetHelper('editor',app)=noErr then begin
  189.             GetTextHelper:=app.fCreator;
  190.         end else begin
  191.             GetTextHelper:='ttxt';
  192.         end;
  193.     end;
  194.  
  195.     function GetTextCreator: OSType;
  196.         var
  197.             dummy: boolean;
  198.             entry: ICMapEntry;
  199.             map:Handle;
  200.     begin
  201.         dummy:= MyGetMapHandle (map); { reset text_creator if the Handle has changed }
  202.         if text_creator = OSType(0) then begin
  203.             dummy := GetCreatorTypeInfo('ttxt', 'TEXT', 'file.txt', entry);
  204.             text_creator := entry.file_creator;
  205.         end;
  206.         GetTextCreator := text_creator;
  207.     end;
  208.  
  209.     procedure GetBinaryCreator; { WARNING: GetBinaryCreator calls GetFilenameInfo calls GetBinaryCreator }
  210.         var
  211.             dummy: boolean;
  212.             entry: ICMapEntry;
  213.             map:Handle;
  214.     begin
  215.         dummy:= MyGetMapHandle (map); { reset binary_creator if the Handle has changed }
  216.         if binary_creator = OSType(0) then begin
  217.             binary_creator := 'hDmp'; { WARNING: we must set binary_creator to avoid unending recursion! }
  218.             binary_type := 'BINA';
  219.             binary_creator_app_name := 'HexEdit';
  220.             if GetFilenameInfo('file.binary', entry, false) then begin
  221.                 binary_creator := entry.file_creator;
  222.                 binary_type := entry.file_type;
  223.                 binary_creator_app_name := entry.creator_app_name;
  224.             end;
  225.         end;
  226.     end;
  227.  
  228.     function GetCreatorTypeInfo (fcreator, ftype: OSType; name: Str255; var entry: ICMapEntry): boolean;
  229.         var
  230.             found:boolean;
  231.             entries: Handle;
  232.     begin
  233.         found := false;
  234.         if has_IC & MyGetMapHandle(entries) then begin
  235.             found:=ICMapEntriesTypeCreator(internet_config_instance, entries, ftype, fcreator, name, entry)= noErr;
  236.         end;
  237.         if not found then begin
  238.             entry.file_type := ftype;
  239.             entry.file_creator := fcreator;
  240.             entry.creator_app_name := OSTypeToString(fcreator);
  241.             if ftype = 'TEXT' then begin
  242.                 entry.flags := ICmap_data_fork_bit;
  243.                 entry.MIME_type := 'text/plain';
  244.                 entry.entry_name := 'Text File';
  245.             end else begin
  246.                 entry.flags := ICmap_binary_bit + ICmap_data_fork_bit;
  247.                 entry.MIME_type := 'application/octet-stream';
  248.                 entry.entry_name := 'Binary File';
  249.             end;
  250.             entry.post_creator := OSType(0);
  251.             entry.extension := '';
  252.             entry.post_app_name := '';
  253.         end;
  254.         GetCreatorTypeInfo := found;
  255.     end;
  256.  
  257.     function GetFilenameInfo (name: Str255; var entry: ICMapEntry; istext: boolean): boolean;
  258.         var
  259.             found: boolean;
  260.             entries: Handle;
  261.             temp_name:Str255;
  262.     begin
  263.         found := false;
  264.         if has_IC & MyGetMapHandle(entries) then begin
  265.             found:= ICMapEntriesFilename(internet_config_instance, entries, name, entry) = noErr;
  266.             if not found & (name <> '') & (name[length(name)]='~') then begin
  267.                 temp_name := TPcopy(name, 1, length(name)-1);
  268.                 found:= ICMapEntriesFilename(internet_config_instance, entries, temp_name, entry) = noErr;
  269.             end;
  270.         end;
  271.         if not found then begin
  272.             if IsExtension(name, '.txt') or istext then begin
  273.                 entry.file_type := 'TEXT';
  274.                 entry.file_creator := GetTextCreator;
  275.                 entry.flags := ICmap_data_fork_mask;
  276.                 entry.creator_app_name := 'SimpleText';
  277.                 entry.MIME_type := 'text/plain';
  278.                 entry.entry_name := 'Text File';
  279.             end else begin
  280.                 GetBinaryCreator;
  281.                 entry.file_type := binary_type;
  282.                 entry.file_creator := binary_creator;
  283.                 entry.creator_app_name := binary_creator_app_name;
  284.                 entry.flags := ICmap_binary_mask + ICmap_data_fork_mask;
  285.                 entry.MIME_type := 'application/octet-stream';
  286.                 entry.entry_name := 'Binary File';
  287.             end;
  288.             entry.post_creator := OSType(0);
  289.             entry.extension := '';
  290.             entry.post_app_name := '';
  291.         end;
  292.         GetFilenameInfo := found;
  293.     end;
  294.  
  295.     function GetICString (const key: Str255; var data: Str255): OSErr;
  296.         var
  297.             err:OSErr;
  298.             size: longint;
  299.             junk_attr: ICAttr;
  300.     begin
  301.         AssertDidStartup( startup_check );
  302.         if has_IC then begin
  303.             size := 256;
  304.             err := ICMapErr(ICGetPref(internet_config_instance, key, junk_attr, @data, size));
  305.         end else begin
  306.             err := -1;
  307.         end;
  308.         if err<>noErr then begin
  309.             data:='';
  310.         end;
  311.         GetICString:=err;
  312.     end;
  313.  
  314.     function GetICStr (const key: Str255): Str255;
  315.         var
  316.             data: Str255;
  317.             junk: OSErr;
  318.     begin
  319.         junk := GetICString(key, data);
  320.         GetICStr := data;
  321.     end;
  322.  
  323.     function SetICString (const key: Str255; data: Str255): OSErr;
  324.     begin
  325.         SetICString := ICMapErr(ICSetPref(internet_config_instance, key, ICattr_no_change, @data, length(data) + 1));
  326.     end;
  327.  
  328.     function SetICBoolean( const key: Str255; data: Boolean ): OSErr;
  329.         var
  330.             n: UInt16;
  331.     begin
  332.         if data then begin
  333.             n := $0101;
  334.         end else begin
  335.             n := 0;
  336.         end;
  337.         SetICBoolean := ICMapErr(ICSetPref(internet_config_instance, key, ICattr_no_change, @n, 1));
  338.     end;
  339.     
  340.     function GetICBoolean( const key: Str255; var result: Boolean ): OSErr;
  341.         var
  342.             data: integer;
  343.             err: OSErr;
  344.             junk_attr: ICAttr;
  345.             size: longint;
  346.     begin
  347.         AssertDidStartup( startup_check );
  348.         err := -1;
  349.         if has_IC then begin
  350.             data := 0;
  351.             size := 1;
  352.             err := ICMapErr( ICGetPref (internet_config_instance, key, junk_attr, @data, size ) );
  353.             if (err = noErr) & (size <> 1) then begin
  354.                 err := -1;
  355.             end;
  356.         end;
  357.         if err = noErr then begin
  358.             result := data <> 0;
  359.         end else begin
  360.             result := false;
  361.         end;
  362.         GetICBoolean := err;
  363.     end;
  364.     
  365.     function GetICBool( const key: Str255 ): Boolean;
  366.         var
  367.             junk: OSErr;
  368.             result: Boolean;
  369.     begin
  370.         junk := GetICBoolean( key, result );
  371.         GetICBool := result;
  372.     end;
  373.     
  374.     procedure GetFontSize (key1,key2:Str255; deffont,defsize:integer; var font, size: integer);
  375.         var
  376.             junk_attr: ICAttr;
  377.             fr: ICFontRecord;
  378.             frsize: longint;
  379.             err:ICError;
  380.     begin
  381.         AssertDidStartup( startup_check );
  382.         frsize := SizeOf(fr);
  383.         err:=ICGetPref(internet_config_instance, key1, junk_attr, @fr, frsize);
  384.         if err<>noErr then begin
  385.             frsize := SizeOf(fr);
  386.             err:=ICGetPref(internet_config_instance, key2, junk_attr, @fr, frsize);
  387.         end;
  388.         if err=noErr then begin
  389.             GetFNum(fr.font, font);
  390.             size := fr.size;
  391.         end else begin
  392.             font := deffont;
  393.             size := defsize;
  394.         end;
  395.     end;
  396.  
  397.     procedure GetScreenFontSize (var font, size: integer);
  398.     begin
  399.         GetMyFonts(MFT_Monaco9, font, size);
  400.         GetFontSize(kICScreenFont, kICListFont, font, size, font, size);
  401.     end;
  402.  
  403.     procedure GetListFontSize (var font, size: integer);
  404.     begin
  405.         GetMyFonts(MFT_Geneva9, font, size);
  406.         GetFontSize(kICListFont,kICScreenFont, font, size, font, size);
  407.     end;
  408.  
  409.     function MyICBegin (perm: ICPerm): OSErr;
  410.     begin
  411.         MyICBegin := ICMapErr(ICBegin(internet_config_instance, perm));
  412.     end;
  413.  
  414.     function MyICEnd: OSErr;
  415.     begin
  416.         MyICEnd := ICEnd(internet_config_instance);
  417.     end;
  418.  
  419.     function InitMyInternetConfig(var msg: integer): OSStatus;
  420.         var
  421.             junk, err: ICError;
  422.             folders: ICDirSpec;
  423.     begin
  424. {$unused(msg)}
  425.         DidStartup( startup_check );
  426.         last_checked:=TickCount;
  427.         map_handle := nil;
  428.         ic_seed := 0;
  429.         text_creator := OSType(0);
  430.         binary_creator := OSType(0);
  431.         err := ICStart(internet_config_instance, g_creator);
  432.         has_IC := err = noErr;
  433.         if has_IC then begin
  434.             folders.vRefNum := app_fs.vRefNum;
  435.             folders.dirID := app_fs.parID;
  436.             junk := ICFindConfigFile(internet_config_instance, 1, @folders);
  437.         end;
  438.         if not g_required then begin
  439.             err := noErr;
  440.         end;
  441.         InitMyInternetConfig := err;
  442.     end;
  443.  
  444.     procedure FinishMyInternetConfig;
  445.         var
  446.             junk: ICError;
  447.     begin
  448.         MDisposeHandle(map_handle);
  449.         if has_IC then begin
  450.             junk := ICStop(internet_config_instance);
  451.         end;
  452.     end;
  453.  
  454.     procedure ConfigureInternetConfig(creator: OSType; required: Boolean);
  455.     begin
  456.         DidStartup( startup_check );
  457.         StartupInternetConfig;
  458.         g_creator := creator;
  459.         g_required := required;
  460.     end;
  461.     
  462.     procedure StartupInternetConfig;
  463.     begin
  464.         SetStartup(InitMyInternetConfig, nil, 0, FinishMyInternetConfig);
  465.     end;
  466.     
  467. end.
  468.             if font = 0 then begin
  469.                 font := deffont;
  470.             end;
  471.             if size = 0 then begin
  472.                 size := defsize;
  473.             end;
  474.